//calculator业务
//计算方法
#pragma once
#include"Protocol.hpp"
#include<string>
enum{
    Div_Err=1,
    Mode_Err,
    Other_Oper
};
class Calculator
{
    public:
    Calculator()
    {

    }
    Response CalculatorHandler(const Request&rq)
    {
        Response spon(0,0);
        switch(rq.op_)
        {
            case '+':spon.result_=rq.x_+rq.y_;
            break;
            case '-':spon.result_=rq.x_-rq.y_;
            break;
            case '*':spon.result_=rq.x_*rq.y_;
            break;
            case '/':if(rq.y_==0){spon.code_=Div_Err;}else spon.result_=rq.x_/rq.y_;
            break;
            case '%':if(rq.y_==0){spon.code_=Mode_Err;}else spon.result_=rq.x_%rq.y_;
            break;
            default:
            spon.code_=Other_Oper;
            break;

        }
        return spon;
    }
    std::string Calculate( std::string& package)
    {
        std::string content;
        bool r=Decode(package,&content);//解包这个步骤，如果解包成功会获取到报文后，会删除掉package前n个长度，n为删除的报文的长度
        if(!r)return "";
        Request rq;
      r=  rq.Deserialize(content);
      if(!r)return "";
      Response rp=CalculatorHandler(rq);
      
      r=rp.Serialize(&content);
      if(!r)return "";
      content=Encode(content);
        return content;  //这里返回的串是经过处理后得到的数据并封包之后要发回去的报文（包含有效载荷跟报头：有效载荷相当于结构体的变量的数据，报头相当于添加了一个变成字符串后的有效载荷的长度）
    }
    ~Calculator()
    {

    }
};